Android — APP 启动时间优化

前言

如果你仔细观察自己写的APP第一次启动的时候,发现有时中间会有黑屏,有时是白屏。造成这样的情况是什么原因呢?如下图:

那就要从APP启动方式开始说起。不过把握一点,那就是导致这种情况的主要原因就是因为APP启动时间过慢,导致View未被绘制完全。为了避免这种情况,我们要对APP启动做优化处理。所以,本篇文章的大致思路就是:

  1. APP 启动方式
  2. APP 启动时间测量
  3. 避免APP启动黑白屏

APP 启动方式

  1. 冷启动

    APP 启动之前,系统没有为此 APP 创建独立进程。比如:设备启动后,第一次启动或者 APP 被移除后台进程再重启。启动流程大致如下:

    点击 icon 加载 APP –> 立即显示白屏或黑屏等 –> Application onCreat –> Activity Init –> Activity onCreat –> 初始化数据,填充显示 View –> Activity onResume

  2. 热启动

    当启动 APP 时,后台存在该应用的进程,这时候从已有的进程中启动,而不需要创建和初始化 Application ,直接创建和初始化它的 Launch Activity。比如:APP 按返回键退出或者按 home 键。

这个时候也就能解释APP启动为什么会出现黑白屏了?那是因为已经进入Acticity,但是还没加载到布局文件,所以就会显示windows窗口的背景。黑屏/白屏就是显示的windoes背景(这个就是theme的设置)。

APP 启动时间测量

  1. 通过 adb 命令测量APP冷启动时间:
1
adb shell am start -W [packageName]/[packageName.MainActivity]

​ 不过这里,要先把 adb.exe 的路径放在环境变量 path下,然后就可以在 AS 终端输入命令查看了。

1
2
3
4
5
6
7
8
C:\Users\SSC\AndroidStudioProjects\Tools>adb shell am start -W com.example.ssc.tools/com.example.ssc.tools.WelcomeActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.ssc.tools/.WelcomeActivity }
Status: ok
Activity: com.example.ssc.tools/.WelcomeActivity
ThisTime: 141
TotalTime: 141
WaitTime: 149
Complete
  1. 从 Android 4.4 (API 19) 开始,Logcat 自动帮我们打印出应用的启动时间。这个时间值从应用启动 (创建进程) 开始计算,到完成视图的第一次绘制 (即 Activity 内容对用户可见) 为止。如:
1
11-27 00:23:12.091 593-617/system_process I/ActivityManager: Displayed com.example.ssc.tools/.MainActivity: +897ms

拒绝黑白屏

比较友好的方式就是通过windowBackground 属性 设置一个自定义样式来替换黑白屏。效果如下:

emmm,其实这张图可以换成应用的Logo,可以参考网易云音乐APP的启动。

首先新建一个名为 shape_launch.xml 的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<!--<item android:drawable="@color/colorPrimary"/>-->
<item >
<bitmap
android:src="@mipmap/launch"
android:gravity="center" />
</item>
</layer-list>

然后自定义一个主题样式:

1
2
3
4
5
<style name="LaunchStyle" parent="AppTheme">
<item name="android:windowBackground">@drawable/shape_launch</item>
<!--<item name="windowActionBar">false</item>-->
<!--<item name="windowNoTitle">true</item>-->
</style>

之后在AndroidManifest文件中给启动的Activity设置这个主题样式。

最后最后,再把布局文件加载前将主题还原到默认:

1
2
3
4
5
6
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.AppTheme);
setContentView(R.layout.activity_main);
initView();
}

参考:

http://www.jianshu.com/p/1c9a18e49482

http://www.jianshu.com/p/e69d22ec0582

APP 启动时间优化方法详解

http://www.jianshu.com/p/add0d4a03914

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?